package com.party.core.service.member;

import com.party.common.paging.Page;
import com.party.core.model.member.*;
import com.party.core.model.order.OrderForm;
import com.party.core.service.IBaseService;
import com.sun.istack.NotNull;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 活动报名服务接口
 * party
 * Created by wei.li
 * on 2016/9/18 0018.
 */
public interface IMemberActService extends IBaseService<MemberAct> {

    /**
     * 根据会员和活动主键获取报名记录
     * @param memberId 会员编号
     * @param activityId 活动编号
     * @return 报名记录
     */
    MemberAct findByMemberAct(String memberId, String activityId);

    /**
     * 根据 商铺商品编号查询报名
     * @param id 商铺商品编号
     * @param page 分页参数
     * @return 报名列表
     */
    List<MemberAct> listByStoreGoodsId(@NotNull String id, Page page);

    /**
     * 查询当前用户发布的活动的报名数据
     * @param memberAct
     * @param page
     * @return
     */
    List<MemberAct> activityMemberActs(MemberAct memberAct, Page page);

    /**
     * 查询报名数
     * @param activityId 活动编号
     * @return 报名数
     */
    List<MemberAct> findMemberNum(String activityId);

    /**
     * 根据主键集合批量查询列表
     * @param ids 主键集合
     * @param applyWithActivity 查询参数
     * @param page 分页信息
     * @return 实体列表
     */
    List<ApplyWithActivity> batchWithActivityList(Set<String> ids, ApplyWithActivity applyWithActivity, Page page);

    /**
     * web端
     * @param memberAct
     * @param params
     * @param page
     * @return
     */
    List<MemberAct> webListPage(MemberAct memberAct, Map<String, Object> params, Page page);

    /**
     * 报名列表
     * @param memberAct 报名信息
     * @param params 查询信息
     * @param page 分页参数
     * @return 报名列表
     */
    List<WithBuyer> withMemberList(MemberAct memberAct, Map<String, Object> params, Page page);

	MemberAct findByOrderId(String orderId);

    /**
     * 报名信息列表
     * @param withBuyer 报名信息
     * @param page 分页参数
     * @return 报名信息列表
     */
    List<WithBuyer> withBuyerList(WithBuyer withBuyer, Page page);

    /**
     * 取消报名
     * @param orderForm 订单信息
     */
    void cancel(OrderForm orderForm);

    List<MemberAct> listPageTwo(MemberAct memberAct, Map<String, Object> params, Page page);

    /**
     * 统计每天的报名量
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计数
     */
    List<HashMap<String, Object>> countByDate(String startDate, String endDate);


    /**
     * 统计每天的报名量
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @param memberId 会员编号
     * @return 统计数
     */
    List<HashMap<String, Object>> countByDate(String startDate, String endDate, String memberId);


    /**
     * 所有待处理订单
     * @return 待处理订单
     */
    Integer onHandCount();

    /**
     * 所有报名
     * @return 统计数
     */
    Integer allCount();


    /**
     * 统计报名数
     * @param memberId 发布者
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @param isCopartner 是否为合伙人
     * @return 统计数
     */
    Integer count(String memberId, String startDate, String endDate, boolean isCopartner);


    /**
     * 统计报名
     * @param memberId 发布者
     * @param isCopartner 是否为合伙人
     * @return 统计数
     */
    Integer count(String memberId, boolean isCopartner);

    /**
     * 报名详情
     * @param withBuyer 报名信息
     * @param page 分页参数
     * @return 报名信息列表
     */
    List<WithBuyer> withActivityList(WithBuyer withBuyer,Map<String, Object> params, Page page);

    /**
     * 获取有效的报名信息
     * @param memberAct
     * @param status
     * @return
     */
	List<MemberAct> getSuccessMemberAct(MemberAct memberAct, Set<Integer> status);

	Integer getSuccessMemberAct(Map<String, Object> params);


    /**
     * 报名者列表
     * @param memberId 机构编号
     * @return 报名者
     */
    List<MemberAct> applicantList(String memberId);

    /**
     * 根据活动统计
     * @param activityId 活动编号
     * @param status 状态
     * @return 统计数
     */
    Integer countByActivity(String activityId, Integer status);

    /**
     * 查询某机构下的所有活动报名者
     * @param partnerId
     * @return
     */
    List<Member> getActMembersByPartnerId(String partnerId);

    /**
     * 查询所有报名成功的数据
     * @return
     */
    List<Map<String, Object>> getAllSuccessGroup(Integer status, String partnerId, String memberId);


    /**
     * 活动报名
     *
     * @param parameter 报名请求参数
     * @param counterfoilId 票据id
     * @param orgId 机构id
     * @return 报名信息
     */
    MemberAct apply(MemberActApplyParameter parameter, String counterfoilId, String orgId);

    Map<String, Object> findDataByDate(String startDate, String endDate, Map<String, Object> params);

    /**
     * 根据活动编号删除报名信息
     *
     * @param activityId 活动编号
     */
    void deleteByActivityId(String activityId);

    Integer disCount(String memberId, String startDate, String endDate);

    /**
     * 查看分销报名
     *
     * @param params 查询参数
     * @param page   分页参数
     * @return 报名人员列表
     */
    List<WithBuyer> listForDistribution(Map<String, Object> params, Page page);

    MemberAct getMyAct(String memberId, String activityId);

    /**
     * 找报名的非付费票据记录
     *
     * @param memberId        用户id
     * @param activityId      活动id
     * @param counterfoilType 票据类型
     * @return
     * @author yifeng
     * @date 9:22 2019/10/12
     **/
    MemberAct getMyActFree(String memberId, String activityId, Integer counterfoilType);

    /**
     * 找报名的付费票据记录
     *
     * @param memberId   用户id
     * @param activityId 活动id
     * @return
     * @author yifeng
     * @date 9:40 2019/10/12
     **/
    MemberAct getMyActNoFree(String memberId, String activityId);


    Integer memberActCount(Map<String, Object> params);

    Integer getSigninMemberCountByMemberGroupId(List<String> partnerIds,Map<String,Object> params);
}
